\chapter{Einleitung}\label{chap:Introduction}

Bild basierende Verfahren der Objekterkennung beinhalten typischerweise als ersten Schritt eine aufwändige Filterung über den gesamten Bildbereich. Dadurch wird es möglich, Bildgradienten zu bestimmen oder \textit{Interest Points} zu identifizieren. Mit einer \gls{CPU} wird der Algorithmus sequentiell abgearbeitet. Diese Arbeit beschäftigt sich mit der Frage, ob die Aufgabe der aufwändigen Filterung mit einer \gls{GPU} effektiver gelöst werden kann.

\section{Aufgabenstellung}

Ein wichtiger Schritt für die Bildverarbeitung ist das sogenannte \textit{smoothing} von Rohdaten. Ein Bild wird aufgenommen und danach geglättet. Für die Glättung wird eine Faltung über das Bild in horizontaler sowie vertikaler Richtung vorgenommen. Diese Aufgabe soll mit der \gls{CPU} sowie der \gls{GPU} gelöst werden. Für beide Verarbeitungseinheiten soll ein Algorithmus entwickelt und gegenseitig verifiziert werden. Das resultierende Produkt ist eine Applikation für Android\footnote{Android ist ein Betriebssystem, welches auf dem Linux Kernel aufbaut und für mobile Geräte verwendet wird.}.
Als Plattform wird ein Tablet Computer zur Verfügung gestellt. Es handelt sich um das Toshiba AT100 mit dem NVidia Tegra-2 Mobile Processor.

\section{Aufgabenanalyse}

\subsection{Prozesse auf der CPU}
Für die Softwareentwicklung auf dem mobilen Betriebssystem Android wird die objekt\-orientierte Sprache Java eingesetzt. Zeitkritische Anwendungen können über das \gls{JNI} zurückgreifen. Mit dem \gls{NDK} ist ein Werkzeug verfügbar, um in den Sprachen C oder C++ Software zu entwickeln. Für den Vergleich zwischen der Faltung auf der \gls{CPU} und jener auf der \gls{GPU} wird in dieser Arbeit kein \gls{NDK} eingesetzt. Die Programmiersprache der Applikation ist Java, ausgenommen im Bereich der \gls{GPU}.

\subsection{Prozesse auf der GPU}
Es gibt verschiedene Möglichkeiten, eigene Prozeduren auf eine \gls{GPU} zu laden. In der Industrie werden unter anderem als \gls{API} Cuda, OpenCV, OpenCL und OpenGL eingesetzt.

\subsubsection{Cuda}
Mit \gls{Cuda} ist es möglich, Prozesse von der \gls{GPU} abarbeiten zu lassen (aus NVidia Website \cite{NVidia2012:Cuda}). Cuda wird von NVidia entwickelt. Matlap zum Beispiel stellt Tool-Pakete zur Verfügung, um über einen Wrapper auf die GPU zuzugreifen. Die unterstützten Grafikkarten sind auf der NVidia Website \cite{NVidia2012:CudaGPUs} aufgelistet. Die Tegra-Familie wird nicht unterstützt.

\subsubsection{OpenCV}
\gls{OpenCV} ist eine Programmbibliothek für die Bildverarbeitung. Sie ist in der Programmiersprache C/C++ geschrieben. Module wie zum Beispiel für die Gesichtserkennung, Gerstenerkennung, Objekterkennung oder Video Tracking können frei verwendet werden. \gls{OpenCV} ermöglicht Zugriffe auf die \gls{GPU}. Unterstützt werden alle Grafik-Prozessoren, welche mit \gls{Cuda} ab Version 1.1 funktionieren (aus OpenCV GPU FAQ \cite{Baksheev2011}).

\subsubsection{OpenCL}
\gls{OpenCL} ist eine Schnittstelle, um Programmteile auf verschiedene Prozessoren auszulagern. Ein OpenCL System definiert sich aus einem Host, dem \gls{OpenCL}-Geräte angehören. Jedes \gls{OpenCL}-Gerät besteht aus unabhängigen Recheneinheiten. Bei Prozessoren sind dies die Anzahl Kerne, bei der Grafikkarte die Shader. Der Host verteilt die Kerne zur Laufzeit auf die verfügbaren Geräte. Die Programmiersprache ist eine erweiterte Form von C (aus Wikipedia \cite{wikipedia:OpenCL2012}). OpenCL wird als offener Standard von der Khronos Group\footnote{Khronos Group ist ein im Jahr 2000 gegründetes Industriekonsortium, das sich für die Erstellung und Verwaltung von offenen Standards im Multimedia-Bereich auf einer Vielzahl von Plattformen und Geräten einsetzt (aus Khronos Group \cite{KHRONOS2012:about}).} betreut.

\subsubsection{OpenGL}
\gls{OpenGL} ist eine \gls{API} zur Entwicklung von 2D- und 3D-Computergrafik. Verschiedene Grafikprozessor-Hersteller implementieren die \gls{OpenGL}-\gls{API}. Für mobile Grafikprozessoren gibt es \gls{OpenGL ES}. Der Tegra 2 Super Chip Processor stellt das \gls{OpenGL ES} 2.0 \gls{API} zur Verfügung. Das \gls{API} mit der Version 2.0 ist nicht abwärts kompatibel. \gls{OpenGL} und \gls{OpenGL ES} wird von der Khronos Group verwaltet. Im Kapitel \ref{chap:OpenGLES20} ab Seite \pageref{chap:OpenGLES20} wird \gls{OpenGL ES} 2.0 behandelt.